在軟體開發中,唯一不變的就是改變,如何在軟體更新迭代中降低服務中斷的風險,是一個重要的課題。
接下來幾天會介紹 服務的部署策略,並透過 Nginx、Argo Rollouts、Flipt 等工具來實現。
首先,讓我們了解幾種常見的部署策略
以下介紹會將舊版本的服務稱為 版本V1,而新版本的服務稱為 版本V2
此策略會先關閉 版本V1 的服務,再啟動 版本V2,故會產生服務中斷。中斷時間長短取決於 版本V1 關閉到 版本V2 啟動之間所花費的時間。
圖檔來自: Six Strategies for Application Deployment
顯而易見,這種方式不適合 Web 或 API 類服務,因為它會嚴重影響服務可用性。然而,對於排程類服務來說,這種策略非常合適,因為排程任務通常不希望多個 Pod 實例同時運行,以避免競爭條件(race condition)。
能透過設定 Kubernetres Deployment 的 .spec.strategy.type==Recreate
屬性來使用此策略。
滾動部署逐步切換流量到新版本服務上當 版本V2 的 Instance 建立好並準備好接收流量時,會將部分流量轉導至 版本V2 的 Instance,然後才關閉 版本V1,這個過程會反覆執行直到 版本V2 取代了 版本V1 全部的 Instance。
圖檔來自: Six Strategies for Application Deployment
這種方式可以在不影響服務的情況下進行更新。Kubernetes Deployment 的默認部署策略就是滾動更新,並且可以根據服務需求來調整更新效率。
也能透過設定 Kubernetres Deployment 的 .spec.strategy.type==RollingUpdate
顯性指定此策略 並 搭配以下屬性控制更新效率
但 Rolling Update 仍有以下限制:
藍綠部署的原理是在不影響現有服務的情況下,先將 版本V2 完整部署並驗證服務正常後,再一次將流量從 版本V1 切換至 版本V2。
圖檔來自: Six Strategies for Application Deployment
這個方式解決了Rolling Update的限制,能即時的切換服務版本,避免了版本混合問題,並且當 版本V2 部署完成後,能透過內部測試的方式提前驗證新版本是否符合要求。
而藍綠部署的代價是必須花費雙倍的系統資源,因為必須同時運行新舊版本的服務。
📘 Kubernetes workload 原生未提供此部署策略,需要搭配其他解決方案。
金絲雀部署是一種逐步切換流量的策略,通常會將一部分(例如 10%)的流量轉移到 版本V2,其餘流量仍然發送到 版本V1。根據版本V2 的運行情況,逐步增加流量,直到完全替換 版本V1。
圖檔來自: Six Strategies for Application Deployment
這個策略再系統進行高風險變更且對測試涵蓋率缺乏信心特別好用,它允許運維團隊逐步觀察新版本的運行狀況,並在發現問題時快速回滾。
你永遠不知道尤其 Legacy 系統幫你準備了什麼驚喜。
圖檔來自: Bug Smashing — A Guide To Debug Your App
📘 Kubernetes workload 原生未提供此部署策略,需要搭配其他解決方案。
本文介紹了四種常見的服務部署策略:重建部署(Recreate)、滾動部署(Rolling Update)、藍綠部署(Blue/Green)、以及金絲雀部署(Canary)。每種策略都有其適用場景與優缺點。
明天我們會透過 Nginx Ingress Controller 來實現 Kubernetes 原生支援的兩個部署策略:藍綠部署(Blue/Green)、以及金絲雀部署(Canary)。